(function($){
    /* プラグイン名（myplugin）を指定 */
    /* 関数にオプション変数を渡す */
    $.fn.jQzigzag = function(config){
        settings = jQuery.extend({
            width: this.attr("width"),
            height: this.attr("height"),
            url: config.url
        });
        ctx = document.getElementById(this.attr("id")).getContext("2d");
        axises = [];
        tooltip = null;
        mouseX = 0;
        mouseY = 0;
        axis_moving = false;
        cell_moving = false;
        can_mouse_wheel = true;
        axis_symbols = [];
        axis_boards = [];
	axis_order = [];
        next_axis_clicked = false;
        next_contents_clicked = false;
        query = "";
        loading = false;
        logger = undefined;

        //外部ファイルの読み込み
        var load_files = [
        "./javascripts/jQzigzag/AxisBoard.js"+"?"+now,
        "./javascripts/jQzigzag/AxisSymbol.js"+"?"+now,
        "./javascripts/jQzigzag/Logger.js"+"?"+now,
        "./javascripts/jQzigzag/ConnectToServer.js"+"?"+now,
        "./javascripts/jQzigzag/Tooltip.js"+"?"+now,
        "./javascripts/jQzigzag/Zzaxis.js"+"?"+now,
        "./javascripts/jQzigzag/Zzcell.js"+"?"+now,
        "./javascripts/jQzigzag/mouse.js"+"?"+now,
        "./javascripts/jQzigzag/util.js"+"?"+now
        ];
        jQuery.each(load_files, function(i, loadfile){
            $.ajax({
                type: "get",
                url: loadfile,
                dataType: "script",
                async: false,
                success: function(data){
                    eval(data);
                }
            })
        });

        logger = new Logger();

        $(this).mousemove(function(e){
            //オフセットを含めて修正
            mouseX = e.pageX - $(this).offset().left;
            mouseY = e.pageY - $(this).offset().top;
        });

        //右クリックのメニューを表示させない
        $(this).bind("contextmenu", function(){
            return false;
        });


        $(this).mousedown(function(e){
            var rightclicked;
            if (e.button == 0) {
                leftclicked = true;
            }
            else {
                leftclicked = false;
            }
            mousePressed(leftclicked);
        });

        //jquery.mousewheel.jsを使用
        $(this).mousewheel(function(e, delta){
            //console.log('"wheel!"');
            if (!can_mouse_wheel) {
                return false;
            }
            //その後のマウスホイールができないようにフラグ変更
            can_mouse_wheel = false;
            var animation_stop = (!cell_moving && !axis_moving);
            if (animation_stop) {
                mousewheeled(delta);
            }
            //画面はスクロールさせない
            return false;
        });

        //検索フォームをチェック
        $('#search').submit(function(){
            //フォームから値を取得
            query = $('#searchbox').val();
            //サーバにクエリを送る;
            //console.log(query);
            //初期データの取得
            ConnectToServerBySubmitQueryContents("", "", true, query);
            //ログの送信
            logger.search_log(query);
            return false;
        });

        Dt = new Date() ;
        var now = Dt.getFullYear()+""+(Dt.getMonth()+1)+""+Dt.getDate()+""+
        Dt.getHours()+""+Dt.getMinutes()+""+Dt.getSeconds();

        init();

        function init(){
            //初期設定とループのスタート


            //初期データの取得
            ConnectToServerBySlideContents("", "", false);

            setInterval(draw, 25);
        }

        function draw(){

            //変数の初期化
            //tooltip = null;

            //バッググラウンド描画

            ctx.fillStyle = 'rgb(251,255,241)';
            ctx.fillRect(0, 0, settings.width, settings.height);
            //線を描く
            ctx.lineWidth = 10;
            
            //影の設定
            ctx.shadowBlur = 0;
            ctx.shadowColor = 0;

            //螺旋描画(Debug)
            ctx.strokeStyle = 'rgb(231,235,221)';
            ctx.beginPath();
            ctx.moveTo(x(0),y(0));
            for(var i = 0; i<=Math.PI*1000; i++){
                //方物螺旋
                //ctx.lineTo(x(80*Math.cos(i/100)*Math.sqrt(i/100)),y(80*Math.sin(i/100)*Math.sqrt(i/100)));
                //アルキメデスの螺旋
                //ctx.lineTo(x(80*Math.cos(i/100)*(i/100)),y(80*Math.sin(i/100)*(i/100)));

                //対数螺旋
                ctx.lineTo(x(100*Math.pow(1.1,(i/100))*Math.cos(i/100)),y(100*Math.pow(1.1,(i/100))*Math.sin(i/100)));
            }
            ctx.stroke();


            //draw開始
            jQuery.each(axises, function(i, axis){
                axis.update();
            });

            //draw開始
            jQuery.each(axis_symbols, function(i, axis_symbol){
                axis_symbol.update();
            });

            //draw開始
            jQuery.each(axis_boards, function(i, axis_board){
                axis_board.draw();
            });


            //どこにも載っていないならtooltip削除
            var tooltip_show = false;
            jQuery.each(axises, function(i, axis){
                jQuery.each(axis.cells,function(i,cell){
                    tooltip_show = tooltip_show || cell.onmouse;
                });
            });
	    jQuery.each(axis_boards,function(i,board){
			    tooltip_show = tooltip_show || board.onmouse;
			});
            if(!tooltip_show){
                tooltip = undefined;
            }

            //tooltip表示
            if (tooltip) {
                tooltip.showTooltip();
            }

            //ロード中の場合、ダイアログを表示
            if (loading) {
                display_dialog();
            }

        }

    };
})(jQuery);
